﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RLProject1.Model.AMEEWorld;

namespace RLProject1.UnitTest
{
    [TestClass]
    public class TilingTest
    {

        [TestMethod]
        public void Tiling_GetProperties() {
            int uAufteilung = 2;
            int anzahlSektoren = 2;
            float[] radien = {1.0f, 2.0f};
            Tiling testObj = new Tiling(uAufteilung, anzahlSektoren, radien);

            Assert.AreEqual(anzahlSektoren, testObj.Sektoren, "Anzahl Sektoren stimmt nicht");
            Assert.AreEqual(radien.Length, testObj.Spuren, "Anzahl Spuren stimmt nicht");
            Assert.AreEqual(uAufteilung + 2, testObj.Unebenheitspartitionen, "Anzahl Unebenheitspartitionen stimmt nicht");
            Assert.AreEqual(anzahlSektoren, testObj.Zielrichtungen, "Anzahl Zielrichtungen stimmt nicht");
        }

        [TestMethod]
        public void Tiling_GibUPartitionsindex() {
            int uAufteilung = 3;
            int anzahlSektoren = 5;
            float[] radien = { 1.0f, 2.0f, 3.0f };
            Tiling testObj = new Tiling(uAufteilung, anzahlSektoren, radien);

            int retVal = 0;
            double input = -0.1;
            int erwartet = 0;

            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 0.0;
            erwartet = 0;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 1.1;
            erwartet = uAufteilung + 1;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 1.0;
            erwartet = uAufteilung + 1;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 0.15;
            erwartet = 1;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 0.45;
            erwartet = 2;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 0.8;
            erwartet = 3;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 1.0 / 3.0;
            erwartet = 2;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 2.0 / 3.0;
            erwartet = 3;
            retVal = testObj.GibUPartitionsindex(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);
        }

        [TestMethod]
        public void Tiling_GibUMittelWert() {
            int uAufteilung = 10;
            int anzahlSektoren = 5;
            float[] radien = { 1.0f, 2.0f, 3.0f };
            Tiling testObj = new Tiling(uAufteilung, anzahlSektoren, radien);

            double retVal = 0;
            int input = 0;
            double erwartet = Double.NegativeInfinity;
            double toleranz = 0.1 / uAufteilung; // 10% Intervalllänge

            retVal = testObj.GibUMittelwert(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = uAufteilung + 1;
            erwartet = Double.PositiveInfinity;
            retVal = testObj.GibUMittelwert(input);
            Assert.AreEqual(erwartet, retVal, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 1;
            erwartet = 0.05;
            retVal = testObj.GibUMittelwert(input);
            Assert.AreEqual(erwartet, retVal, toleranz, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 6;
            erwartet = 0.55;
            retVal = testObj.GibUMittelwert(input);
            Assert.AreEqual(erwartet, retVal, toleranz, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);

            input = 10;
            erwartet = 0.95;
            retVal = testObj.GibUMittelwert(input);
            Assert.AreEqual(erwartet, retVal, toleranz, "Input {0}. {1} erwartet, {2} erhalten!", input, erwartet, retVal);
        }

        [TestMethod]
        public void Tiling_Dimension() {
            int uAufteilung = 1;
            int anzahlSektoren = 2;
            float[] radien = { 1.0f };
            Tiling testObj = new Tiling(uAufteilung, anzahlSektoren, radien);

            int erwartet = 18;
            int retVal = testObj.Dimension;
            Assert.AreEqual<int>(erwartet, retVal, "Dimension erwartet: {0}. Erhalten: {1}\nU-Intervalle: 1(+2), Sektoren: 2, Spuren: 1", erwartet, retVal);

            uAufteilung = 1;
            anzahlSektoren = 1;
            radien = new float[]{ 2.1f };
            testObj = new Tiling(uAufteilung, anzahlSektoren, radien);

            erwartet = 3;
            retVal = testObj.Dimension;
            Assert.AreEqual<int>(erwartet, retVal, "Dimension erwartet: {0}. Erhalten: {1}\nU-Intervalle: 1(+2), Sektoren: 2, Spuren: 1", erwartet, retVal);
        }

    }
}
